package com.eunion.web.common.base;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;

import com.eunion.core.exception.ProjectException;
import com.eunion.web.common.vo.WebPageVo;

/**
 * 基类，提供一些基础方法. <p> 主要为规定子类行为.
 * 
 * @param <T>
 * @param <ID>
 * 
 * @version 2015-9-13
 */
public abstract class BaseAbstractController<T, ID extends Serializable> {

    /**
     * 日志 子类也可用 .
     */
    protected Logger LOG = LoggerFactory.getLogger(getClass());

    /**
     * 设置模块名，英文，方便前台据此动态展示数据.
     * 
     * @param model
     *            待设置参数的对象
     */
    protected abstract void setModule(Model model);

    /**
     * 获取WebPageVo.
     * 
     * @return WebPageVo
     */
    protected abstract WebPageVo getWebPageVo();

    /**
     * 获取基本的Service服务类，用于处理基本的逻辑.
     * 
     * @return 基本的Service服务
     */
    protected abstract BaseService<T, ID> getBaseService();

    /**
     * 获取泛型实例.
     * 
     * @return 实体.
     */
    @SuppressWarnings("unchecked")
    public T getT() {
        try {
            Type sType = getClass().getGenericSuperclass();
            Type[] generics = ((ParameterizedType) sType).getActualTypeArguments();
            Class<T> mTClass = (Class<T>) (generics[0]);
            return mTClass.newInstance();
        } catch (InstantiationException e) {
            LOG.error("实例化出错", e);
            throw new ProjectException("获取实例出错 ", e);
        } catch (IllegalAccessException e) {
            LOG.error("实例化出错", e);
            throw new ProjectException("获取实例出错 ", e);
        }
    }

}
